package controllers

import (
	"bluebell6/logic"
	"bluebell6/models"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"strconv"
)

// GetPostListHandler2 升级版帖子列表接口
// @Summary 升级版帖子列表接口
// @Description 可按社区按时间或分数排序查询帖子列表接口
// @Tags 帖子相关接口(api分组展示使用的)
// @Accept application/json
// @Produce application/json
// @Param Authorization header string true "Bearer JWT"
// @Param object query models.ParamPostList false "查询参数"
// @Security ApiKeyAuth
// @Success 200 {object} _ResponsePostList
// @Router /posts2 [get]
// CreatePostHandler创建帖子
func CreatePostHandler(c *gin.Context) {
	//1.获取参数及参数的校验
	//c.ShouldBindJSON()  //validator -->binging tag
	p := new(models.Post)
	if err := c.ShouldBindJSON(p); err != nil {
		zap.L().Debug("c.ShouldBindJSON(p) err", zap.Any("err", err))
		zap.L().Error("c.ShouldBindJSON(p) with invalid param")
		ResponseError(c, CodeInvalidParsm)
		return
	}
	//从c取到当前发请求的用户ID
	userID, err := getCurrentUserID(c)
	if err != nil {
		ResponseError(c, CodeNeedLogin)
		return
	}
	p.AuthorID = userID
	//2.创建帖子
	if err := logic.CreatePost(p); err != nil {
		zap.L().Error("logic.CreatePost failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}

	//3.返回响应
	ResponseSuccess(c, nil)
}

// GetPostDetailHandler获取帖子详情
func GetPostDetailHandler(c *gin.Context) {
	//1.获取参数(从URL中获取帖子的id)
	pidstr := c.Param("id")
	//解析为数字类型
	pid, err := strconv.ParseInt(pidstr, 10, 64)
	if err != nil {
		zap.L().Error("strconv.ParseInt failed", zap.Error(err))
		ResponseError(c, CodeInvalidParsm)
		return
	}
	//2.根据id取出帖子的数据
	data, err := logic.GetPostById(pid)
	if err != nil {
		zap.L().Error("logic.GetPostById failed(pid)", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}
	//3.返回响应
	ResponseSuccess(c, data)

}

// GetPostListHandler获取帖子列表的处理函数
func GetPostListHandler(c *gin.Context) {
	//获取分页参数
	page, size := getPageInfo(c)
	//1.获取数据
	data, err := logic.GetPostList(page, size)
	if err != nil {
		zap.L().Error("logic.GetPostList failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}
	ResponseSuccess(c, data)
	//返回响应
}

// GetPostListHandler2 升级版帖子列表接
// 根据前端传来的参数动态的获取帖子列表
// 按创建时间排序 或者 按照 分数排序
// 1.获取请求的query string参数
// 2.去redis查询id列表
// 3.根据id去数据库查询帖子详细信息
func GetPostListHandler2(c *gin.Context) {
	//GET请求参数(query string):/api/v1/posts2?page=1&size=1&order=time
	//初始化结构体时指定初始cshu
	p := &models.ParamPostList{
		Page:  1,
		Size:  10,
		Order: models.OrderTime,
	}
	//c.ShouldBind根据请求的数据类型选择相应的方法取到数据
	//c.ShouldBindJSON()如果请求中携带的是json格式的数据,才能用这个方法取到数据
	if err := c.ShouldBindQuery(p); err != nil {
		zap.L().Error("c.ShouldBindQuery(p) with invalid param", zap.Error(err))
		ResponseError(c, CodeInvalidParsm)
		return
	}
	//1.获取数据
	data, err := logic.GetPostListNew(p) // 更新：合二为一
	if err != nil {
		zap.L().Error("logic.GetPostList failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}
	ResponseSuccess(c, data)
	//返回响应
}

////根据社区去查询帖子列表
//func GetCommunityPostListHandler(c *gin.Context) {
//	//初始化结构体时指定初始cshu
//	p := &models.ParamCommunityPostList{
//		ParamPostList: &models.ParamPostList{
//			Page:  1,
//			Size:  10,
//			Order: models.OrderTime,
//		},
//	}
//	//c.ShouldBind根据请求的数据类型选择相应的方法取到数据
//	//c.ShouldBindJSON()如果请求中携带的是json格式的数据,才能用这个方法取到数据
//	if err := c.ShouldBindQuery(p); err != nil {
//		zap.L().Error("GetCommunityPostListHandler with invalid param", zap.Error(err))
//		ResponseError(c, CodeInvalidParsm)
//		return
//	}
//	//1.获取数据
//	data, err := logic.GetCommunityPostList(p)
//	if err != nil {
//		zap.L().Error("logic.GetCommunityPostListHandler failed", zap.Error(err))
//		ResponseError(c, CodeServerBusy)
//		return
//	}
//	ResponseSuccess(c, data)
//	//返回响应
//}
